local hl = vim.api.nvim_set_hl
local m = require('utils.color')


local M = {}
M.set_it = function()

    hl(0, "@variable", { fg = m.blue })
    hl(0, "@variable.builtin", { fg = m.fg_1 })
    hl(0, "@variable.parameter", { fg = m.yellow_dark })
    hl(0, "@variable.parameter.builtin", { fg = m.yellow_dark })
    hl(0, "@variable.member", { fg = m.fg_js_var_member })


    hl(0, "@constant", { fg = m.fg_python_constant })
    hl(0, "@constant.builtin", { fg = m.fg_python_constant })
    hl(0, "@constant.macro", { fg = m.fg_python_constant })


    hl(0, "@module", { fg = m.fg_3 })
    hl(0, "@module.builtin", { fg = m.fg_3 })


    hl(0, "@label", { fg = m.red })

    -- Strings
    hl(0, "@string", { fg = m.fg_2 })
    hl(0, "@string.documentation", { fg = m.fg_2 })
    hl(0, "@string.regexp", { fg = m.fg_2 })
    hl(0, "@string.escape", { fg = m.red })
    hl(0, "@string.special", { fg = m.red })
    hl(0, "@string.special.symbol", { fg = m.red })
    hl(0, "@string.special.url", { fg = m.blue })
    hl(0, "@string.special.path", { fg = m.blue })

    -- Characters
    hl(0, "@character", { fg = m.fg_2 })
    hl(0, "@character.special", { fg = m.red })

    -- Booleans
    hl(0, "@boolean", { fg = m.blue })

    -- Numbers
    hl(0, "@number", { fg = m.blue })
    hl(0, "@number.float", { fg = m.blue })

    -- Types
    hl(0, "@type", { fg = m.blue })
    hl(0, "@type.builtin", { fg = m.blue_light })
    hl(0, "@type.definition", { fg = m.blue })
    hl(0, "@type.qualifier", { fg = m.blue })

    -- Attributes
    hl(0, "@attribute", { fg = m.blue })
    hl(0, "@attribute.builtin", { fg = m.blue })

    -- Properties
    hl(0, "@property", { fg = m.blue })

    -- Functions
    hl(0, "@function", { fg = m.blue_light })
    hl(0, "@function.builtin", { fg = m.blue_light })
    hl(0, "@function.call", { fg = m.blue })
    hl(0, "@function.macro", { fg = m.blue_light })
    hl(0, "@function.method", { fg = m.blue_light })
    hl(0, "@function.method.call", { fg = m.fg_2 })

    -- Constructors
    hl(0, "@constructor", { fg = m.fg_python_constant })

    -- Operators
    hl(0, "@operator", { fg = m.blue })

    -- Keywords
    hl(0, "@keyword", { fg = m.blue })
    hl(0, "@keyword.coroutine", { fg = m.blue })
    hl(0, "@keyword.function", { fg = m.blue })
    hl(0, "@keyword.operator", { fg = m.blue })
    hl(0, "@keyword.import", { fg = m.blue })
    hl(0, "@keyword.type", { fg = m.red })
    hl(0, "@keyword.modifier", { fg = m.blue })
    hl(0, "@keyword.repeat", { fg = m.blue })
    hl(0, "@keyword.return", { fg = m.blue })
    hl(0, "@keyword.debug", { fg = m.blue })
    hl(0, "@keyword.exception", { fg = m.blue_light })
    hl(0, "@keyword.conditional", { fg = m.blue })
    hl(0, "@keyword.conditional.ternary", { fg = m.blue })
    hl(0, "@keyword.directive", { fg = m.blue })
    hl(0, "@keyword.directive.define", { fg = m.blue })

    -- Punctuation
    hl(0, "@punctuation.delimiter", { fg = m.blue })
    hl(0, "@punctuation.bracket", { fg = m.blue })
    hl(0, "@punctuation.special", { fg = m.blue })

    -- Comments
    hl(0, "@comment", { fg = m.fg_2 })
    hl(0, "@comment.documentation", { fg = m.fg_2 })
    hl(0, "@comment.error", { fg = m.red })
    hl(0, "@comment.warning", { fg = m.yellow_dark })
    hl(0, "@comment.todo", { fg = m.blue })
    hl(0, "@comment.note", { fg = m.blue })

    -- Markup (for languages like Markdown, RST, etc.)
    hl(0, "@markup.strong", { fg = m.fg, bold = true })
    hl(0, "@markup.italic", { fg = m.fg, italic = true })
    hl(0, "@markup.strikethrough", { fg = m.fg, strikethrough = true })
    hl(0, "@markup.underline", { fg = m.fg, underline = true })
    hl(0, "@markup.heading", { fg = m.red })
    hl(0, "@markup.heading.1", { fg = m.red })
    hl(0, "@markup.heading.2", { fg = m.red })
    hl(0, "@markup.heading.3", { fg = m.red })
    hl(0, "@markup.heading.4", { fg = m.fg })
    hl(0, "@markup.heading.5", { fg = m.fg })
    hl(0, "@markup.heading.6", { fg = m.fg })
    hl(0, "@markup.quote", { fg = m.fg_2 })
    hl(0, "@markup.math", { fg = m.blue })
    hl(0, "@markup.link", { fg = m.blue })
    hl(0, "@markup.link.label", { fg = m.blue })
    hl(0, "@markup.link.url", { fg = m.blue })
    hl(0, "@markup.raw", { fg = m.red })
    hl(0, "@markup.raw.block", { fg = m.red })
    hl(0, "@markup.list", { fg = m.blue })
    hl(0, "@markup.list.checked", { fg = m.blue })
    hl(0, "@markup.list.unchecked", { fg = m.blue })

    -- Diff
    hl(0, "@diff.plus", { fg = m.red_deep, bg=m.bg })
    hl(0, "@diff.minus", { fg = m.red, bg=m.bg })
    hl(0, "@diff.delta", { fg = m.yellow_dark, bg=m.bg })

    -- Tags (HTML, XML, JSX, etc.)
    hl(0, "@tag", { fg = m.blue_light, bold = true })
    hl(0, "@tag.builtin", { fg = m.blue_light, bold = true })
    hl(0, "@tag.attribute", { fg = m.yellow_dark, italic = true })
    hl(0, "@tag.delimiter", { fg = m.blue })
    hl(0, "@tag.content", { fg = m.fg_2 })
    hl(0, "@tag.comment", { fg = m.fg_2, italic = true })

    -- Special
    hl(0, "@none", {})
    hl(0, "@conceal", {})

    -- Spell checking
    hl(0, "@spell", { fg = m.fg_2 })
    hl(0, "@nospell", { fg = m.fg_2 })

    -- Language-specific overrides and additional groups

    -- CSS specific
    hl(0, "@pseudo-class", { fg = m.blue })

    -- Python specific overrides
    hl(0, "@operator", { fg = m.fg_1 })
    hl(0, "@number", { fg = m.fg_1 })
    hl(0, "@variable", { fg = m.fg_2 })
    hl(0, "@variable.member", { fg = m.fg_1 })
    hl(0, "@keyword.conditional", { fg = m.blue_light })
    hl(0, "@keyword.function", { fg = m.yellow_dark })
    hl(0, "@keyword.operator", { fg = m.blue_light })
    hl(0, "@function", { fg = m.fg_1 })
    hl(0, "@function.builtin", { fg = m.fg_1 })
    hl(0, "@function.method", { fg = m.red })
    hl(0, "@function.method.call", { fg = m.blue })
    hl(0, "@function.call", { fg = m.yellow_dark })

    -- misc
    hl(0, "@method", { fg = m.fg_1 })
    hl(0, "@method.call", { fg = m.fg_1 })
    hl(0, "@parameter", { fg = m.blue })
    hl(0, "@include", { fg = m.blue })
end

return M
